//自己
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size(), left=0, right=0,  sum=nums[0], len=n;//len初始化为n,不能是0, 防止更新len取最小值时出错
        for ( ; left < n; left++)
        {
            while (right < n)//注意
            {   
                //cout << right << " ";
                if (sum < target) //先判断 + 进窗口   //注意
                {
                    if (right == n-1 && left == 0) return 0; //全加起来都不满足, 直接返回0
                    if (right == n-1) break;

                    right++;//不能越界, 
                    sum += nums[right];
                    //cout << right << " ";
                }
                else //if (sum >= target) //满足
                {
                    int temp =  right - left + 1 ;
                    len = min(temp, len); // len = temp < len ? temp : len; //更新, 保留当前和之前较小的
                    break;
                }
                // else 
                // {
                //     printf("%d %d\n", left, right); 
                // }
            }
            sum -= nums[left];//准备出窗口, sum-=
        }
        return len;
    }
};


//答案
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size(), sum=0, len=INT_MAX;//len初始化为INT_MAX,不能是0, 防止更新len取最小值时出错, 也不建议n, 有可能恰好满足条件返回n, 有可能全遍历完了也没满足(需要判断一下, 返回0)
        for (int left=0, right=0; right < n; right++)//进窗口;  right越界说明和不够target, 需要加元素, 但已经没元素了, 所以结束
        {
            sum += nums[right];//进窗口同时sum+=
            while (sum >= target)//判断满足
            {   
                len = min(len, right-left+1);//更新结果, 保留较小值
                sum -= nums[left++];//出窗口 同时sum-=
            }
        }
        return len==INT_MAX ? 0 : len;//==INT_MAX说明没有满足条件的子数组
    }
};
//时间 O(2N)
//空间 O(1)